<?php
/**
 * peck 默认控制器
 *
 * @filesource _controller.class.class.php
 * @package peck
 * @subpackage _helper
 * @version $id: 0.1, utf8, Sat Jan  9 10:30:11 CST 2010
 * @author LD King <kldscs[at]gmail.com>
 * @copyright Copyleft (D.) 2007 - 2010 MiFunny China Inc.
 * @link http://mifunny.info/
 * @see  
 */
abstract class _controller{
	/**
	 * HTTP Request variables
	 * 
	 * @var array
	 */
	protected $_request = null;
	
    /**
     * 构造函数
     */
    public function __construct(){
    	// 输出编码
    	$charset = _core::get('sys/charset');
    	empty($charset) or header('Content-Type:text/html;charset='.$charset);
    }
	
    /**
     * 默认动作
     */
    abstract function actionIndex();
    
	/**
     * 执行指定的动作, 没有返回值 TRUE or FALSE
     *
     * @return mixed
     */
    public function execute($action_method, array $args = array()){
        try{
        	//HTTP Request variables
        	$this->_request = $args;
        	 
        	// 执行指定的前置方法
        	$this->_before_execute();
			
			// call_user_func_array(array('对象object', '方法名method'), $args)
        	$response = call_user_func_array(array($this, $action_method), $args);
        
        	// 执行指定的后置置方法
        	$this->_after_execute($response);
        	
        	if(is_null($response)){
        		return TRUE;
        	}else 
        		return $response; 
        }catch(Exception $e){
        	throw new RuntimeException('('.__METHOD__.')ERROR: '.$e->__toString());
        	return FALSE;
        }
    }
	
	
	/**
     * 指定的控制器动作未定义时调用
     *
     * @param string $action_name
     */
	protected function __call($name, $args){
		throw new RuntimeException('('.__METHOD__.')ERROR: method <b>'.$name.'</b> not defined !');
	}

    /**
     * 执行控制器动作之前调用
     */
    protected function _before_execute(){}

    /**
     * 执行控制器动作之后调用
     *
     * @param mixed $response
     */
    protected function _after_execute(& $response){}
    
    /**
     * 得到HTTP请求变量
     * 
     * @param string $key
     * @param mixed $default
     * 
     * @return mixed
     */
    public function _request($key, $default=null){
    	return isset($this->_request[$key]) ? $this->_request[$key] : $default;
    }

}//END class _controller.class
?>